/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package netGenerator;

import Segments.Segment;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

/**
 *
 * @author emmanuel
 */
public class NetGenerator {
    private  int entradaX = 5;
    private int entradaY= 3;
    private int segmentosX = 4 ;
    private int segmentosY = 6;
    private int width = 8;
    private int length = 132;
    private Segment[][] contH ;
    private Segment[][] contV ;
    

   
    public NetGenerator() {
        contH = new Segment[100][100];
        contV = new Segment[100][100];
    }

    public NetGenerator(int entradaX, int entradaY, int segmentosX, int segmentosY, int width, int length) {
        this.entradaX = entradaX;
        this.entradaY = entradaY;
        this.segmentosX = segmentosX;
        this.segmentosY = segmentosY;
        this.width = width;
        this.length = length;
        this.contH = new Segment[entradaX][this.segmentosX + this.entradaY];
        this.contV = new Segment[entradaY][this.segmentosY];
    }
    
    public void genNet(String path){
       
        
        if(this.segmentosY == this.entradaX || this.segmentosY - this.entradaX ==1){
            
        }else{
            System.out.println("Error");
        }
        if(this.segmentosX == this.entradaY || this.segmentosX - this.entradaY ==1){
            
        }else{
            System.out.println("Error");
        }
        this.segmentosX = this.segmentosX + this.entradaY;
        
        // Crear los segmentos en X
        int segmentos = 0;
        for(int j = 0; j < segmentosX;j++)
            for(int i = 0;i<entradaX;i++){
                contH[i][j] = new Segment();
                contH[i][j].setAttribute("id",segmentos+"");
                contH[i][j].setAttribute("length",length+"");
                
                segmentos++;
            }
       
        //para las x
        int cont2=0;
       int cont1 = 0;
       boolean flag = false;
       for(int j=0;j<segmentosX; j ++){
           cont1 = cont2;
           if(flag) cont2 = cont2+width;
           else cont2 = cont2+length;
           for(int i = 0; i<entradaX; i++){
               contH[i][j].setAttribute("x1",cont1+"");
               contH[i][j].setAttribute("x3",cont1+"");
               contH[i][j].setAttribute("x2",cont2+"");
               contH[i][j].setAttribute("x4",cont2+"");
               
           }
           if(flag) flag = false;
           else flag = true;
           
           
       }
       //para las y
       cont2 = length;
       for(int i= 0 ;i<entradaX;i++){
           cont1 = cont2;
           cont2 = cont1+width;
           for(int j = 0;j<segmentosX;j++){
               contH[i][j].setAttribute("y1",cont1+"");
               contH[i][j].setAttribute("y2",cont1+"");
               contH[i][j].setAttribute("y3",cont2+"");
               contH[i][j].setAttribute("y4",cont2+"");
               
           }
           cont2= cont2+length;
           
       }
       
       //Dar de alta los segmentos en Y
       
       for(int j = 0; j<entradaY;j++)
           for(int i = 0; i<segmentosY;i++){
               contV[i][j] = new Segment();
               contV[i][j].setAttribute("id",segmentos+"");
               contV[i][j].setAttribute("length",length+"");
               segmentos++;
           }
       
       cont2 = 0;
       for(int j = 0;j<entradaY;j++){
           cont1 = cont2 +length;
           cont2 = cont1 + width;
           for(int i = 0;i<segmentosY;i++){
                contV[i][j].setAttribute("x1",cont1+"");
               contV[i][j].setAttribute("x2",cont1+"");
               contV[i][j].setAttribute("x3",cont2+"");
               contV[i][j].setAttribute("x4",cont2+"");
           }
       }
       cont2 = 0;
       for(int i = 0;i<segmentosY;i++){
           cont1 = cont2;
           cont2 = cont1 + length;
           for(int j= 0;j<entradaY;j++){
               contV[i][j].setAttribute("y1",cont1+"");
               contV[i][j].setAttribute("y3",cont1+"");
               contV[i][j].setAttribute("y2",cont2+"");
               contV[i][j].setAttribute("y4",cont2+"");
               
           }
           cont2  = cont2 +width;
       }
       
       //Conecciones
       
       for(int i = 0;i<entradaX;i++)
           for(int j = 0;j<segmentosX;j++){
               if(j<(segmentosX-1))
                   contH[i][j].addConnection(contH[i][j+1].getId());
           }
       
       int n = 1;
       for(int j = 0;j<entradaY;j++){
           for(int i = 0;i<segmentosY;i++){
               if(n<segmentosX && i<entradaX){
                   contV[i][j].addConnection(contH[i][n].getId());
                   contH[i][n].addConnection(contV[i+1][j].getId());
                   contH[i][n].setAttribute("length",width+"");
                   
               }
           }
       n = n +2;
       }
       
        try {
                FileOutputStream out = new FileOutputStream(path, true);

                PrintWriter miArchivo = new PrintWriter(out);
                miArchivo.write("<?xml version=\""+"1.0\""+" encoding=\""+"UTF-8\""+"?>");
                miArchivo.println();
                        
                miArchivo.write("<Network>");
                miArchivo.println();
                miArchivo.write("<Streets>");
                miArchivo.println();
                
                for(int j = 0;j<segmentosX;j++)
                    for(int i = 0;i<entradaX;i++){
                        miArchivo.write(contH[i][j].getXMLData());
                        miArchivo.println();
                    }
                for(int j = 0;j<entradaY;j++)
                    for(int i=0;i<segmentosY;i++){
                        miArchivo.write(contV[i][j].getXMLData()); 
                        miArchivo.println();
                    }
                
                miArchivo.println();
                miArchivo.write("</Streets>");
                miArchivo.println();
                miArchivo.write("</Network>");
                miArchivo.println();
                miArchivo.close();

            } catch (IOException ioe) {
                //System.out.println("Error en la creaci�n del archivo log.txt");
                throw new UnsupportedOperationException("The output file log cant be created !!"+ioe);
            }

    }
    public static void main(String[] args){
        NetGenerator x = new NetGenerator();
        x.genNet("c:/temp/MiNetwork.xml");
    }
}
